#ifndef SHADER_H
#define SHADER_H

#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>

#include <iostream>
#include <string>
#include <fstream>

class Shader
{
	public :
	
    /****************************************************/
    /*					Properties 						*/
    /****************************************************/
	
    bool init ;/*!< Booléen retourné permettant de déterminer si l'initialisation du shader c'est déroulé correctement */

    std::string vsPath;		/*!< Chemin vers le fichier contenant le code du vertexShader 		*/
    std::string fsPath;		/*!< Chemin vers le fichier contenant le code du fragment Shader	*/
	
	GLuint vShader;		/*! Indice du vertexShader dans la mémoire 	 */
	GLuint fShader;		/*! Indice du fragmentShader dans la mémoire */

	GLuint program;		/*! Indice du program dans la mémoire		 */
	
    /****************************************************/
    /*					Constructors                    */
    /****************************************************/
	
    /*!
     *      \fn Crée le "programme" de rendu à partir des chemins des fichiers du vertex et du fragment shaders
     */

    Shader(std::string avPath, std::string afsPath);

    /*!
     *      \fn Constructeur par recopie
     */
	Shader(const Shader & );

    /*!
     *      \fn Destructeur
     */

	~Shader();
		
    /****************************************************/
    /*					Methods							*/
    /****************************************************/
	
    /*!
     *      \fn Méthode permettant d'initialiser l'ensemble des shaders
     */

	int Init();

    /*!
     *      \fn Initialise, crée et compile les shaders nécéssaire au "programme" de rendu
     *
     *          \param GLuint & shader : référence vers l'identifiant du shader
     *          \param GLenum typeShader :  Type du shader, peut prendre 2 valeurs :GL_VERTEX_SHADER ou GL_FRAGMENT_SHADER
     *          \param std::string filePath : Chemin ou est enregistré le fichier contenant le code du shader
     */

	void InitShader(GLuint & shader, GLenum typeShader, std::string filePath);
	
    /*!
     *      \fn Compile le shader passé en paramètre
     */

    int CompileShader(GLuint shader,GLenum typeShader, std::string filePath);

    /*!
     *      \fn Création du programme à partir des 2 shaders compilé
     */

    int CreateProgram();

    /*!
     *      \fn Link du programme
     */

    int LinkProgram();

    /*!
     *      \fn Définit les attributs (variables) passé au shaders
     */

	void BindAttributesLocation();

    /*!
     *      \fn Permet de définir ses propres attributeLocation
     */

    void DefineAttributeLocation(int indiceAttrib, std::string idAttrib);

    /*!
     *      \fn Permet d'utiliser  le programme crée
     */

	void UseProgram();

    /*!
     *      \fn Désactive le programme
     */

    void DisableProgram();
};

#endif
